#include <array>
#include <iostream>
#include <boost/asio.hpp>

// 使用 boost::asio 的 TCP 协议相关功能
using boost::asio::ip::tcp;

int main(int argc, char *argv[])
{
    try
    {
        //./daytime_client time.nist.gov
        // 检查命令行参数，需要提供服务器主机名
        if (argc != 2)
        {
            std::cerr << "Usage: client <host>" << std::endl;
            return 1;
        }

        // 创建 IO 上下文对象，用于所有 IO 操作
        boost::asio::io_context io_context;

        // 创建解析器对象，用于将主机名解析为 IP 地址
        tcp::resolver resolver(io_context);
        // 解析主机名和服务名("daytime")，获取可能的终端点列表
        tcp::resolver::results_type endpoints =
            resolver.resolve(argv[1], "13133");

        // 创建套接字对象
        tcp::socket socket(io_context);
        // 尝试连接到解析得到的终端点
        boost::asio::connect(socket, endpoints);

        // 循环读取服务器发送的数据
        for (;;)
        {
            // 创建缓冲区
            std::array<char, 256> buf;
            boost::system::error_code error;

            // 从套接字读取数据到缓冲区
            size_t len = socket.read_some(boost::asio::buffer(buf), error);
            // 打印长度
            std::cout << "接收到数据长度: " << len << std::endl;
            // 检查是否遇到错误
            if (error == boost::asio::error::eof)
            {
                std::cout << "服务器正常关闭连接: 客户端退出" << len << std::endl;
                break;
            }
            // 服务器正常关闭连接
            else if (error)
                throw boost::system::system_error(error); // 发生其他错误

            // 将接收到的数据写入标准输出
            std::cout.write(buf.data(), len);
        }
    }
    // 捕获并处理可能发生的异常
    catch (std::exception &e)
    {
        // 异常发送
        std::cout << "捕获异常 " << std::endl;
        std::cerr << e.what() << std::endl;
        std::cout << "捕获异常结束 " << std::endl;
    }

    return 0;
}